home *** CD-ROM | disk | FTP | other *** search
- #import <stdio.h>
- #import "/LocalApps/Mathematica.app/Library/Mathematica/MathLink/Includes/mathlink.h"
-
- #define DEBUG FALSE
-
- void error(MLINK);
- void read_and_print_expression(MLINK);
- int ReadPacket(MLINK);
-
- void example_1(char *,double *,int *,double,double,double);
-
- MLINK link;
-
- main()
- {
- int i,n;
- double min,max,del,result[1000];
-
- link = MLStart("math -mathlink -batchoutput -noinit");
-
- min = 0.0;
- max = 1.0;
- del = .5;
-
- example_1("x y",result,&n,min,max,del);
- for (i=0 ; i < n ; i++)
- printf("%d , %f\n",i,result[i]);
-
- MLClose(link);
- }
-
- void example_1(function,realarray,num,min,max,del)
- char *function;
- double *realarray,min,max,del;
- int *num;
- {
- int i;
- double rtnreal;
-
- MLPutFunction(link,"Chop",1);
- MLPutFunction(link,"SetPrecision",2);
- MLPutFunction(link,"Flatten",1);
- MLPutFunction(link,"Table",3);
- MLPutFunction(link,"List",1);
- MLPutFunction(link,"ToExpression",1);
- MLPutString(link, function);
- MLPutFunction(link,"List",4);
- MLPutSymbol(link,"x");
- MLPutReal(link,min);
- MLPutReal(link,max);
- MLPutReal(link,del);
- MLPutFunction(link,"List",4);
- MLPutSymbol(link,"y");
- MLPutReal(link,min);
- MLPutReal(link,max);
- MLPutReal(link,del);
- MLPutInteger(link,3);
- MLEndPacket(link);
-
- if (DEBUG)
- {
- read_and_print_expression(link);
- return;
- }
-
- while (MLNextPacket(link) != RETURNPKT)
- MLNewPacket(link);
-
- MLCheckFunction(link,"List",num);
- for (i=0 ; i < *num ; i++)
- {
- MLGetReal(link,&rtnreal);
- realarray[i] = rtnreal;
- }
- }
-
- void error( mlp) MLINK mlp;
- {
- fprintf( stderr, "\nerror: %s\n", MLErrorMessage( mlp));
- MLClose( mlp);
- exit( 0);
- } /* error */
-
- void read_and_print_expression( p) MLINK p;
- {
- char *s;
- int n, i, len;
- double r;
- static int indent;
-
- i=MLGetNext(p);
- fprintf(stderr, "Packet type = %d\n",i);
-
- switch (i) {
- case MLTKSYM:
- MLGetSymbol( p, &s);
- fprintf( stderr, "%s ", s);
- break;
- case MLTKSTR:
- MLGetString( p, &s);
- fprintf( stderr, "\"%s\" ", s);
- break;
- case MLTKINT:
- MLGetInteger( p, &n);
- fprintf( stderr, "%d ", n);
- break;
- case MLTKREAL:
- MLGetReal( p, &r);
- fprintf( stderr, "%f ", r);
- break;
- case MLTKFUNC:
- indent += 3;
- fprintf( stderr, "\n %*.*s", indent, indent, "");
- if (MLGetArgCount( p, &len) == 0) {
- error( p);
- }else{
- read_and_print_expression(p);
- fprintf( stderr, "[");
- for (i = 1; i <= len; ++i) {
- read_and_print_expression(p);
- if (i != len) fprintf( stderr, ", ");
- }
- fprintf( stderr, "]");
- }
- indent -= 3;
- break;
- case MLTKERROR:
- default:
- error( p);
- }
- } /* read_and_print_expression */
-
-
- int ReadPacket( mlp) MLINK mlp;
- { int code;
- int len = 1;
-
- switch (code = MLNextPacket(mlp)) {
- case INPUTPKT:
- fprintf( stderr, "<INPUTPKT>");
- break;
- case OUTPUTPKT:
- fprintf( stderr, "<OUTPUTPKT>");
- break;
- case TEXTPKT:
- if (DEBUG) fprintf( stderr, "<TEXTPKT>");
- break;
- case RETURNPKT:
- fprintf( stderr, "Result (expression):");
- break;
- case RETURNTEXTPKT:
- fprintf( stderr, "=");
- break;
- case MESSAGEPKT:
- len = 2;
- fprintf( stderr, "\nMessage packet:");
- break;
- case CALLPKT:
- fprintf( stderr, "<CALLPKT>");
- break;
- case INPUTNAMEPKT:
- fprintf( stderr, "\n");
- break;
- case OUTPUTNAMEPKT:
- if (DEBUG) fprintf( stderr, "<OUTPUTNAMEPKT>");
- break;
- case CONTROLPKT:
- fprintf( stderr, "<CONTROLPKT>");
- break;
- case SYNTAXPKT:
- fprintf( stderr, "<SYNTAXERROR>");
- break;
- default:
- fprintf( stderr, "unknown packet \"%d\"\n", code);
- return 0;
- }
- while (len --) {
- read_and_print_expression( mlp);
- }
- if ((code != INPUTNAMEPKT) && (code != OUTPUTNAMEPKT)) {
- fprintf( stderr, "\n");
- }
- return code;
- } /* ReadPacket */
-
- /*******************************************/
- /* Search for string t in string s */
- /* Return position if found, otherwise -1 */
- /*******************************************/
- int instr(s,t)
- char *s,*t;
- {
- int i,j,k;
-
- for (i=0 ; s[i] && t[0] ; i++)
- {
- for (j=i , k=0 ; t[k] && s[j] == t[k] ; j++ , k++);
- if (!t[k])
- return(i);
- }
- return(-1);
- }
-